##设计模式
###基础:
1.抽象
2.封装
3.多态
4.继承
####设计原则:
1.找出应用中可能需要变化之处,把它们独立出来,不要那些需要变化的代码混在一起
2.针对接口编程,而不是针对实现编程
3.组合优于继承
1 策略模式
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算的的客户。
使用策略模式实现鸭子的各种行为。这句话告诉我们,鸭子的行为被封装进入一组类中,可以被轻易
地扩充与改变。如果需要,甚至在运行时也可以改变行为。
2 观察者(Observer)模式
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会受
到通知并自动跟新。
出版者+订阅者=观察者模式
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
改变主题或者观察者其中一方,并不会影响另一方。
比如新增观察者,不需要修改主题的代码,只需在新的类里实现此观察者接口,然后注册为观
察者即可。
设计原则:
4 为了交互对象之间的松藕设计而努力。
Java.util.Observalbe是一个类,违反针对接口编程原则,我们一般用它实现观察者模式,而是定义
自己的接口去实现。其他观察者模式:Swing API:JButton---------会看到许多增加与删listener
的方法。
##设计原则:类对扩展开发,对修改关闭
装饰着可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
3 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的提单方案
**高内聚低耦合**---想尽一切办法解耦
4 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把类实例化推迟到子类。
##依赖倒置原则
设计原则:要依赖抽象,不要依赖具体类。
变量不可以持有具体类的引用
不要让类派生自具体类
不要覆盖基类中已实现的方法。
5 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
6 命令模式将“请求”封装成对象,以便使不同的请求、队列或者日志参数化其他对象。命令模式也支持可撤销的操作。
把方法调用封装起来
命令模式的更多用途:队列请求。(日程安排,线程池,工作队列)
适配器模式与外观模式
客户使用适配器的过程如下:
客户通过请求目标接口调用适配器的方法对适配器发出请求
适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口。
客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
7 适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
“对象”适配器和“类”适配器
类适配器不是使用组合来适配被适配者,而是继承被适配者和目标类。
装饰者:不改变接口,但假如责任
适配者:将一个接口转换成另一个接口
外观:让接口更简单
外观不只是简化了接口,也将客户从组建的子系统中解耦。
外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成同接口。
8 外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
设计原则:只和你的密友谈话
不要赢得太多的朋友和影响太多的对象:
就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:
该对象本身
被当做方法的参数而传递进来的对象
此方法所创建或实例化的任何对象
对象的任何组件
将方法调用保持在界限内—遵守最少知识原则
8 模板方法模式模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重写定义算法的某些步骤。
我们也可以有“默认不做事的方法”,我们称这种方法为”hook”。子类可以视情况而定要不要覆盖他们。
钩子可以让子类实现算法中可选的部分,或者在钩子对于子类的实现并不重要的时候,子类可以对此钩子置之不理。钩子还可以让子类能够有机会对模板中某些即将发生的步骤做出反应。
好莱坞原则 别调用我们,我们会调用你。(防止依赖腐败)当高层组件依赖低层组件,而低层组件又依赖高层组件,而高层组件又依赖边侧组件,而边侧组件又依赖低层组件时,依赖腐败就发生了。
sort()——Comparable–compareTo()
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类
模板方法模式为我们提供了代码复用的重要技巧
模板方法的抽象类可以定义具体方法、抽象方法和钩子。
抽象方法由子类实现。
为了防止子类改变模板方法中的算法,可以将模板方法声明为final
好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何以及何时调用低层模块。
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
迭代器与组合模式
9 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
迭代器模式把元素之间游走的责任交给迭代器而不是聚合对象。这不仅让聚合的接口和实现变得更简洁,也可以让聚合更专注在它所应该专注的事情上面,而不必理会遍历的事情。
设计原则 一个类应该只有一个引起变化的原因。
10 组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式能让我们用树形方式创建对象的结构,树里面包含了组合以及个别的对象。
使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
11 状态模式
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
状态模式和侧罗模式有相同的类图,但是他们的意图不同。
策略模式通常会用行为或算法来配置Context类
状态模式允许Context随着状态的改变而改变行为。
状态转换可以由State类或Context类控制。
使用状态模式通常会导致设计中类的数目大量增加。
状态类可以被多个Context实例共享、